package com.nightsoul.dubbo.provider.service;

import com.nightsoul.dubbo.provider.service.CacheService;

/**
 * 远程服务后，客户端通常只剩下接口，而实现全在服务器端，但提供方有些时候想在客户端也执行部分逻辑，比如：做ThreadLocal缓存，提前验证参数，调用失败后伪造容错数据等等，
 * 此时就需要在API中带上Stub，客户端生成Proxy实，会把Proxy通过构造函数传给Stub，然后把Stub暴露组给用户，Stub可以决定要不要去调Proxy
 *
 */
public class CacheServiceStub implements CacheService {
	private final CacheService cacheService;
	
	// 构造函数传入真正的远程代理对象
	public CacheServiceStub(CacheService cacheService) {
		this.cacheService = cacheService;
	}
	
	
	@Override
	public String findCache(String id) {
		System.out.println("find cache in sub");
		// 此代码在客户端执行
        // 你可以在客户端做ThreadLocal本地缓存，或预先验证参数是否合法，等等
		try {
			if(id==null) {
				throw new RuntimeException();
			}
			return cacheService.findCache(id);
		} catch(Exception e) {
			// 你可以容错，可以做任何AOP拦截事项
			return "exception:"+id;
		}
	}

}
